package com.ljx.javaredis;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@SpringBootTest
class JavaRedisApplicationTests01 {

	@Test
	void contextLoads() {
	}
	// 测试redis中key的api(各种方法)
	@Test
	void testKey(){
		//连接redis
		Jedis jedis = new Jedis("192.168.126.132", 6379);
		// 获取所有的key
		Set<String> keys = jedis.keys("*");
		System.out.println(keys);
		// 删除指定的key
		Long k1 = jedis.del("k1");
		System.out.println(k1);
		// 判断指定的key是否存在
		Boolean k11 = jedis.exists("k1");
		System.out.println(k11);
		// 删除所有的key
		String s = jedis.flushDB();
		System.out.println(s);
	}
	// 测试字符串类型的jedis方法
	@Test
	void testString(){
		// 建立连接
		Jedis jedis = new Jedis("192.168.126.132", 6379);
		// 存放字符串(返回存入的结果)
		/*String setName = jedis.set("name", "ljx");
		System.out.println(setName);
		// 存储字符串数据并为其设置过期时间（返回存入的结果）
		String age = jedis.setex("age", 33l, "23.11");
		System.out.println(age);
		// 查看key是否过期(返回过期时间)
		Long age1 = jedis.ttl("age");
		System.out.println(age1);
		// 如果指定的key存在，则不存储，否则就存储(返回0 则存在其他则不存在)
		Long setnx = jedis.setnx("name", "cq");
		System.out.println(setnx);
		// 获取指定key的值
		String name = jedis.get("name");
		System.out.println(name);
		// 获取指定的key值，并删除key
		String k4 = jedis.getDel("k4");
		System.out.println(k4);
		// 为指定的key进行递增，递减decr/decrby，点赞操作，收藏数可以使用(返回key递增后的值)
		Long k3 = jedis.incrBy("k3", 100l);
		System.out.println(k3);
		// 查询多个key值()
		List<String> mget = jedis.mget("name", "k3");
		System.out.println(mget);
		// 还有为多个key设置值 jedis.mset()
		String age = jedis.mset("age", "12", "address", "hn");
		System.out.println(age);
		// 追加值，如果key已经存在并且是字符串类型，则使用此命令将值附加在字符串结尾(返回key值中的个数)
		Long append = jedis.append("name", "dsg");
		System.out.println(append);
		// 检索key中指定范围的字符串
		String k1 = jedis.getrange("k1", 0, -1);
		System.out.println("---"+k1);
		// 查看数据类型
		String name = jedis.type("name");
		System.out.println(name);
		//查看字符串的长度
		Long name1 = jedis.strlen("name");
		System.out.println(name1);
		// 如果不存在此值，则返回null并且创建此值
		String set = jedis.getSet("address", "hn");
		System.out.println(set);
		// 如果此值存在 ，则获取原来的值，并将其重新赋值
		String set1 = jedis.getSet("name", "ljxCJdsg");
		System.out.println(set1);*/

	}
	// 测试hash类型的jedis方法
	@Test
	void testHash(){
		//连接redis
		Jedis jedis = new Jedis("192.168.126.132", 6379);


		/*// 清空数据库(成功返回ok)
		String s = jedis.flushDB();
		System.out.println(s);
		// 单个存储存储hash数据（返回成功存储的哈希值的个数）
		Long hset = jedis.hset("user:1", "name", "ljx");
		System.out.println(hset);
		// 存储多个hash值(map的泛型都是string类型)（返回成功存储的哈希值的个数）
		Map<String, String> hashMap = new HashMap<>();
		hashMap.put("name","cq");
		hashMap.put("age","26");
		hashMap.put("address","hn");
		Long hset1 = jedis.hset("user:2", hashMap);
		System.out.println(hset1);
		// 获取指定key 对应的field的值
		String name = jedis.hget("user:1", "name");
		System.out.println(name);
		// 获取多个字段值返回list集合
		List<String> hmget = jedis.hmget("user:2", "name", "age", "address");
		System.out.println(hmget);
		// 返回哈希表中所有的field值(返回值为set类型)
		Set<String> hkeys = jedis.hkeys("user:2");
		System.out.println(hkeys);
		// 返回哈希表中所有的value值(返回值为list)
		List<String> hvals = jedis.hvals("user:2");
		System.out.println(hvals);*/
		// 获取所有的key value返回类型为map
		Map<String, String> stringStringMap = jedis.hgetAll("user:1");
		System.out.println(stringStringMap);
		// (如果存在，则存储不成功)
		Long hsetnx = jedis.hsetnx("user:1", "name", "ljxdsg");
		System.out.println(hsetnx);
		// 指定增量
		Long age = jedis.hincrBy("user:2", "age", 100l);
		System.out.println(age);

	}
	// 测试创建连接池和不创建连接池的区别
	@Test
	public void redisPoll(){
		/*
			1、创建JedisPool连接池对象
			2、调用连接池对象的方法 getResource() 以获取Jedis连接
			3、使用Jedis连接 完成方法
			4、将连接归还到连接池中

		* */
		// 创建连接池的配置类
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMinIdle(5);// 设置最小空闲连接个数
		jedisPoolConfig.setMaxIdle(10);// 设置最大空闲连接个数
		jedisPoolConfig.setMaxTotal(20);// 设置最大允许连接数量
		jedisPoolConfig.setMaxWaitMillis(5000);// 最大等待时间
		jedisPoolConfig.setTestOnBorrow(true);// 是否检验池子中的jedis对象可用

		// 创建连接对象(在创建Jedis连接池对象的时候传入配置对象 同时须设置服务端地址)
		JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.126.132", 6379);
		Jedis jedis = jedisPool.getResource();
		// 没有创建连接池
		Jedis jedis1 = new Jedis( "192.168.126.132", 6379);
		long start = System.currentTimeMillis();



		for (int i = 0; i < 10000; i++) {
			jedis1.ping();
			jedis1.close();
		}
		long end = System.currentTimeMillis();
		System.out.println("共耗时"+(end-start));
	}

	// 测试list队列
	@Test
	void testList(){
		// 创建连接池的配置类
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxWaitMillis(5000);
		jedisPoolConfig.setMaxTotal(100);
		jedisPoolConfig.setMaxIdle(10);
		jedisPoolConfig.setMinIdle(5);
		// 创建链接对象(
		// JedisPool#getResource()方法从连接池中取得一个Jedis实例
		JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.126.132",6379);
		Jedis jedis = jedisPool.getResource();

		Long lpush = jedis.lpush("ljx", "a", "b", "c");
		System.out.println(jedis.lpop("ljx"));
		System.out.println(jedis.lrange("ljx", 0l, -1l));
		System.out.println(jedis.ltrim("ljx", 0l, 3l));
		System.out.println(jedis.llen("ljx"));
		System.out.println(jedis.lrem("ljx", 1, "c"));
		System.out.println(jedis.lset("ljx", 0l, "A"));

	}
	// 测试set集合
	@Test
	void testset(){
		// 创建连接池的配置类
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxWaitMillis(5000);
		jedisPoolConfig.setMaxTotal(100);
		jedisPoolConfig.setMaxIdle(10);
		jedisPoolConfig.setMinIdle(5);
		// 创建链接对象(
		// JedisPool#getResource()方法从连接池中取得一个Jedis实例
		JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.126.132",6379);
		Jedis jedis = jedisPool.getResource();

		jedis.sadd("baga","baga1","baga2","baga3","baga4");
		System.out.println(jedis.srem("baga", "baga1"));
		System.out.println(jedis.sismember("baga", "baga4"));
		Set<String> baga = jedis.smembers("baga");
		System.out.println(baga);
		System.out.println(jedis.scard("baga"));


	}

	// 测试sort有序set集合
	@Test
	void testZset(){
		// 创建连接池的配置类
		JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMaxWaitMillis(5000);
		jedisPoolConfig.setMaxTotal(100);
		jedisPoolConfig.setMaxIdle(10);
		jedisPoolConfig.setMinIdle(5);
		// 创建链接对象(
		// JedisPool#getResource()方法从连接池中取得一个Jedis实例
		JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.126.132",6379);
		Jedis jedis = jedisPool.getResource();

		jedis.zadd("haha",111,"yuwen");
		Map<String, Double> hashMap = new HashMap<>();
		hashMap.put("shuxu",150d);
		hashMap.put("yinyu",10d);
		hashMap.put("jav",150d);
		jedis.zadd("haha",hashMap);
		System.out.println(jedis.zcard("haha"));
		Set<String> haha = jedis.zrange("haha", 0, -1);
		System.out.println(haha);
		System.out.println(jedis.zincrby("haha", 10, "jav"));
		System.out.println(jedis.zrem("haha", "yinyu"));



	}

}
